思路:
考虑如何使取出的 个数价值最大。
对于 ,根据定义,若 个数中至少有一个数的二进制位 上是 ,则价值增加 ,这个定义十分眼熟,发现就是按位或的结果。对于 , 每增加 ,就会使 增加 ,因此每个二进制位的出现次数都需要加 才能使答案更优,显然不如 的情况。
因此对于 ,答案即为这些数的或;对于 ,答案为数列任取三个数能得到的最大的或。可以花费 枚举取的三个数得到答案。
因为懒得特判前者,我选择牺牲了一定的代码常数,将 都从 枚举到 ,但是对于前者也能得到正确的结果。
代码:
//By: Luogu@rui_er(122461)
#include <bits/stdc++.h>
#define loop while(true)
#define rep(x,y,z) for(ll x=y;x<=z;x++)
#define per(x,y,z) for(ll x=y;x>=z;x--)
#define fil(x,y) memset(x, y, sizeof(x))
#define mulT0 ll T; for(scanf("%lld", &T);T;T--)
#define mulT1 ll T, rnds; for(scanf("%lld", &T),rnds=1;rnds<=T;rnds++)
using namespace std;
typedef long long ll;
const ll N = 505;
ll n, a[N], ans;
int main() {
scanf("%lld", &n);
rep(i, 1, n) scanf("%lld", &a[i]);
rep(i, 1, n) rep(j, 1, n) rep(k, 1, n) ans = max(ans, a[i]|a[j]|a[k]);
printf("%lld\n", ans);
return 0;
}